<?php
declare (strict_types = 1);

namespace app\admin\controller;

use app\common\controller\Backend;
use think\response\View;
use hg\apidoc\annotation as Apidoc;
use think\facade\Db;

/**
 * 角色管理
 * @Apidoc\Group("base")
 * @package app\admin\controller
 */
class Role extends Backend
{
    /**
     * 初始化参数
     * @author 贾二小
     * @since 2021/7/3
     */
    public function initialize()
    {
        $this->config = [
            'name'=>'角色管理',
            'table_name'=>'role',//表名
            'role_menu_table_name'=>'role_menu',//表名
            'role_data_table_name'=>'role_data_scope',//表名
            'table_alias' => 'a',//别名
            'table_field'=>'*',//显示默认字段
            'form_field' => 'id,name,code,data_scope_type,sort,status,remark',//表单字段，没有设置则默认为显示字段默认是不能有*和.)
            'form_validated1' => [
                'name' => ['msg' => '名称为空', 'regex' => false, 'pcre' => '',],
                'code' => ['msg' => 'code为空', 'regex' => false, 'pcre' => '',],
            ],//表单验证
            'form_validated2' => ['code'],//重复验证
            'search_table'=> null,//关联表时，需要重写
            'is_limit'=> true,//是否分页显示
            'search_field' => 'id,name,code,data_scope_type,sort,status,remark,create_user_id,create_date,update_user_id,update_date',//查询表格字段
            'search_param'=>[
                ['field' => 'name', 'type' => '=', 'param'=> 'name'],
                ['field' => 'code', 'type' => '=', 'param'=> 'code'],
            ],//查询表格条件
            'is_delete'=> true,//是否假删除
            'id_validated' => [
                'id' => ['msg' => 'ID不能为空', 'regex' => false, 'pcre' => '', 'regex_msg'=>'', 'db'=>true, 'db_msg'=>'当前角色不存在'],
            ],//表单验证
        ];
        parent::initialize(); // TODO: Change the autogenerated stub
    }

    public function grant_data(): View
    {
        return view();
    }

    /**
     * @Apidoc\Title("角色授权菜单")
     * @author 贾二小
     * @since 2021/7/10
     */
    public function grant_menu(): View
    {
        return view();
    }

    /**
     * 角色下拉框
     * @author 贾二小
     * @since 2021/7/1
     */
    public function drop_down(){
        $data = Db::name($this->config['table_name'])->field('id,code,name')->select();
        $this->success($data);
    }

    /**
     * @Apidoc\Title("角色授权菜单ID")
     * @author 贾二小
     * @since 2021/7/11
     */
    public function own_menu(){
        //获取参数
        $id = intval(input('id'));
        //数据验证
        $this->form_validated('id_validated');
        //数据查询
        $data = Db::name($this->config['role_menu_table_name'])->where(['role_id'=>$id])->column('menu_id');
        //返回
        $this->success($data);
    }

    /**
     * @Apidoc\Title("角色授权菜单ID保存")
     * @author 贾二小
     * @since 2021/7/11
     */
    public function post_grant_menu(){
        //获取参数
        $id = intval(input('id'));
        $menu_ids = input('menu_ids/a');
        //数据验证
        $this->form_validated('id_validated');
        if(count($menu_ids) === 0){
            $this->error('请选择授权的菜单');
        }
        //数据组装
        $data = array_map(
            function ($item) use ($id) {
                return ['role_id'=>$id,'menu_id'=>$item];
            }, $menu_ids
        );
        //数据库操作
        Db::transaction(function () use ($id, $data) {
            //删除所有默认
            Db::name($this->config['role_menu_table_name'])->where(['role_id'=>$id])->delete();
            //插入当前数据
            Db::name($this->config['role_menu_table_name'])->insertAll($data);
        });
        //日志
        $this->sLog($this->config['name'].'_授权角色',"成功");
        //返回
        $this->success();
    }

    /**
     * @Apidoc\Title("角色授权数据ID")
     * @author 贾二小
     * @since 2021/7/11
     */
    public function own_data(){
        //获取参数
        $id = intval(input('id'));
        //数据验证
        $this->form_validated('id_validated');
        //数据查询
        $data = Db::name($this->config['role_data_table_name'])->where(['role_id'=>$id])->column('org_id');
        //返回
        $this->success($data);
    }

    /**
     * @Apidoc\Title("角色授权数据ID保存")
     * @author 贾二小
     * @since 2021/7/11
     */
    public function post_grant_data(){
        //获取参数
        $id = intval(input('id'));
        $data_scope_type = intval(input('data_scope_type'));
        $org_ids = input('org_ids/a');
        //数据验证
        $this->form_validated('id_validated');
        if($data_scope_type == 5 && count($org_ids) === 0){
            $this->error('请选择授权的组织架构');
        }
        //数据组装
        $data = [];
        $data['data_scope_type'] = $data_scope_type;
        $data['update_user_id'] = _current_user('id');
        $org_data = [];
        if($data_scope_type == 5){
            $org_data = array_map(
                function ($item) use ($id) {
                    return ['role_id'=>$id,'org_id'=>$item];
                }, $org_ids
            );
        }
        //数据库操作
        Db::transaction(function () use ($id, $org_ids, $data, $org_data) {
            //更新角色表
            Db::name($this->config['table_name'])->where(['id'=>$id])->update($data);
            if($data['data_scope_type'] === 5){
                //删除所有默认
                Db::name($this->config['role_data_table_name'])->where(['role_id'=>$id])->delete();
                //插入当前数据
                Db::name($this->config['role_data_table_name'])->insertAll($org_data);
            }
        });
        //日志
        $this->sLog($this->config['name'].'_授权数据',"成功");
        //返回
        $this->success();
    }
}